//
// Created by LiuYou on 2021/6/27.
//

#include <cstdlib>
#include <pthread.h>
#include <cstdio>
#include <cstring>
#include <unistd.h>
#include <memory>

#define THR_NUM         4

static void* thr_func(void* pVoid) {
    int c = 'a' + *((int*) pVoid);

    delete (int*) pVoid;

    while (true) {
        write(1, &c, 1);
    }

    pthread_exit(nullptr);
}

/**
 * @brief 对10的段错误的改进。
 * 对多个线程同时访问的 i 进行了改进。
 * 使用了多态分配来做了一个 i 的副本。在main线程分配内存, 然后在其它线程销毁。
 * 最后的结果也是运行成功了。
 *
 * 但是有一个遗憾是
 * 对于程序11来说, 因为我是单核。所以模拟不出来 abababab acabababacbc等
 * 结果只能是 aaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbb cccccccccccccc aaaaaaaaaaaaaaaaaa 这样的时间片轮转。
 */
int main() {


    pthread_t tid[THR_NUM]{};

    // main线程创建了这么多线程。
    for (int i = 0; i < THR_NUM; ++i) {
        // TODO 注意: 在 C++中这里是有段错误的。
        //  通过调试将错误锁定在了这个强转这里。
        //  原因: C++不允许这样的强转。而 C是允许的。

        int* pInt = new int(i);

        int err = pthread_create(tid + i, nullptr, thr_func, pInt);
//        int err = pthread_create(tid + i, nullptr, thr_func, static_cast<void*>(i));
//        int err = pthread_create(tid + i, nullptr, thr_func, (void*) i);
        if (err) {
            std::fprintf(stderr, "pthread_create(): %s\n", std::strerror(err));
            std::exit(EXIT_FAILURE);
        }
    }

    alarm(5);


    // main线程对创建的线程进行收尸。
    for (int i = 0; i < THR_NUM; ++i) {
        pthread_join(tid[i], nullptr);
    }


    std::exit(EXIT_SUCCESS);
}